package com.luzhikun.servletextends;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
 * @Author liu-miss
 * @Description 后期回顾
 * @Date 14:59 2021/5/4
 * @Param
 * @return
 *
 * Servlet的执行原理：
 *
 *      两个Map：
 *          Web容器中存在两个Map，这两个Map的key均为Servlet注册时的<url-patten/>,但其value不同
 *          第一个Map的value是Servlet实例对象的引用，第二个Map的Value为<servlet-class/>的值，即Servlet类的全路径
 *
 *      执行原理:
 *          当对Servlet的请求到达Servlet容器时，会先对请求进行解析，使用解析出来的URL，作为比较对象，从第一个Map中查找是否有
 *          相同的key。若存在相同的key，那么读取其value，即Servlet对象的引用，执行该Servlet的service（）方法
 *          若不存在相同的key，那么再从第二个Map中查找是否有相同的key。若存在，则读取其value，既要访问的Servlet的全路径，然后
 *          使用反射机制创建该Servlet实例，并将这个实例写入到第一个Map中，然后执行该Servlet的service()方法，
 *          Class.forName(className)
 *
 *      自我理解：
 *              Web容器中存在两个Map，其中他们的key相同，都是我们自己注册Servlet时起的别名，
 *              但是value不同，第一个Map的value是Servlet实例对象的引用，第二个Map的Value为<servlet-class/>的值，即Servlet类的全路径
 *
 *              执行原理：
 *                  当客户端发出请求，这个请求到达Servlet容器时，就会解析这个请求，解析出来的是一个URL地址
 *                  服务器会用这个URL地址去 对比 第一个Map中的key，意思就是如果这个请求的地址已经加载过了 就不用了再次重新加载
 *                  直接在第一个Map中的value中就可以找到 它的实例对象， 然后读取后执行service（）方法就完事了
 *
 *                  如果没有在第一个Map的key中找到解析出来的URL，就是没有一样的，就会去第二个里边找，如果找到了，会创建一个该Servlet的
 *                  实例对象，并将该实例对象写入到第一个Map中
 *                  没找到，就会报404错误
 *
 *
 **/
public class SomeServlet extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("执行SomeServlet的");

        /*获取请求方式*/
        HttpServletRequest serq = (HttpServletRequest) servletRequest;
        HttpServletResponse sepo = (HttpServletResponse) servletResponse;

        String method = serq.getMethod();
        System.out.println(method);

        //判断是非法用户还是正常用户
        if ("POST".equals(method)) {
            System.out.println("正常用户");
            System.out.println("请开始身份验证");
        }
        if ("GET".equals(method)) {
            System.out.println("非法用户");
        }
    }
}
